package com.wugui.datax.rpc.remoting.provider.impl;

import java.util.Map;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import com.wugui.datax.rpc.remoting.provider.XxlRpcProviderFactory;
import com.wugui.datax.rpc.remoting.provider.annotation.XxlRpcService;
import com.wugui.datax.rpc.util.XxlRpcException;

/**
 * xxl-rpc provider (for spring)
 *
 * @author xuxueli 2018-10-18 18:09:20
 */
public class XxlRpcSpringProviderFactory extends XxlRpcProviderFactory
		implements ApplicationContextAware, InitializingBean, DisposableBean {

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

		Map<String, Object> serviceBeanMap = applicationContext.getBeansWithAnnotation(XxlRpcService.class);
		if (serviceBeanMap != null && serviceBeanMap.size() > 0) {
			for (Object serviceBean : serviceBeanMap.values()) {
				// valid
				if (serviceBean.getClass().getInterfaces().length == 0) {
					throw new XxlRpcException("xxl-rpc, service(XxlRpcService) must inherit interface.");
				}
				// add service
				XxlRpcService xxlRpcService = serviceBean.getClass().getAnnotation(XxlRpcService.class);

				String iface = serviceBean.getClass().getInterfaces()[0].getName();
				String version = xxlRpcService.version();

				super.addService(iface, version, serviceBean);
			}
		}

		// TODO，addServices by api + prop

	}

	@Override
	public void afterPropertiesSet() throws Exception {
		super.start();
	}

	@Override
	public void destroy() throws Exception {
		super.stop();
	}

}
